suppressPackageStartupMessages(library(tidyverse))
library(gapminder)

Saving Graphs to File

p <- ggplot(mtcars, aes(hp, wt)) + 
    geom_point()
ggsave(, PLOT_OBJECT_HERE)
Error in plot_dev(device, filename, dpi = dpi) : 
  argument "filename" is missing, with no default

Scales; Colour

Scale functions in ggplot2 take the form scale_[aesthetic]_[mapping]().

Let’s first focus on the following plot:

  1. Change the y-axis tick mark spacing to 10; change the colour spacing to include all powers of 10.

  1. Specify scales::*_format in the labels argument of a scale function to do the following:
    • Change the x-axis labels to dollar format (use scales::dollar_format())
    • Change the colour labels to comma format (use scales::comma_format())

  1. Use RColorBrewer to change the colour scheme.
    • Notice the three different types of scales: sequential, diverging, and continuous.
p_scales +
    scale_x_log10(labels=dollar_format()) +
    scale_colour_distiller(
        trans   = "log10",
        breaks  = 10^(1:10),
        labels  = comma_format(),
        palette = "Green"
    ) +
    scale_y_continuous(breaks=10*(1:10))
Unknown palette Green

  1. Use viridis to change the colour to a colour-blind friendly scheme
    • Hint: add scale_colour_viridis_c (c stands for continuous; d discrete).
    • You can choose a palette with option.

Theming

Changing the look of a graphic can be achieved through the theme() layer.

There are “complete themes” that come with ggplot2, my favourite being theme_bw (I’ve grown tired of the default gray background, so theme_bw is refreshing).

  1. Change the theme of the following plot to theme_bw():

  1. Then, change font size of axis labels, and the strip background colour. Others?

Plotly

Consider the following plot:

  1. Convert it to a plotly object by applying the ggplotly() function:
library(ggplotly)
ggplotly(p)
  1. You can save a plotly graph locally as an html file. Try saving the above:
    • NOTE: plotly graphs don’t seem to show up in Rmd notebooks, but they do with Rmd documents.
p %>% 
    ggplotly() %>% 
    htmlwidgets::saveWidget("LOCATION_GOES_HERE")
  1. Run this code to see the json format underneath:
p %>% 
    ggplotly() %>% 
    plotly_json()
  1. Check out code to make a plotly object from scratch using plot_ly() – scatterplot of gdpPercap vs lifeExp.
plot_ly(gapminder, 
        x = ~gdpPercap, 
        y = ~lifeExp, 
        type = "scatter",
        mode = "markers",
        opacity = 0.2) %>% 
    layout(xaxis = list(type = "log"))
Error in plot_ly(gapminder, x = ~gdpPercap, y = ~lifeExp, type = "scatter",  : 
  could not find function "plot_ly"
  1. Add population to form a z-axis for a 3D plot:
plot_ly(gapminder, 
        x = ~gdpPercap, 
        y = ~lifeExp, 
        z = FILL_THIS_IN,
        type = "scatter3d",
        mode = "markers",
        opacity = 0.2)
LS0tCnRpdGxlOiAiY20tMDEzLWV4ZXJjaXNlLlJtZCIKYXV0aG9yOiAiR3Vyam90IFNpbmdoIgpkYXRlOiAiMTYvMTAvMjAxOCIKb3V0cHV0OiBodG1sX25vdGVib29rCmVkaXRvcl9vcHRpb25zOiAKICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lCi0tLQoKYGBge3J9CnN1cHByZXNzUGFja2FnZVN0YXJ0dXBNZXNzYWdlcyhsaWJyYXJ5KHRpZHl2ZXJzZSkpCmxpYnJhcnkoZ2FwbWluZGVyKQpgYGAKCgojIFNhdmluZyBHcmFwaHMgdG8gRmlsZQoKLSBEb24ndCB1c2UgdGhlIG1vdXNlCi0gVXNlIGBnZ3NhdmVgIGZvciBnZ3Bsb3QKICAgIC0gUHJhY3RpY2UgYnkgc2F2aW5nIHRoZSBmb2xsb3dpbmcgcGxvdCB0byBmaWxlOiAKCmBgYHtyfQpwIDwtIGdncGxvdChtdGNhcnMsIGFlcyhocCwgd3QpKSArIAogICAgZ2VvbV9wb2ludCgpCmdnc2F2ZSgsIFBMT1RfT0JKRUNUX0hFUkUpCmBgYAoKLSBCYXNlIFIgd2F5OiBwcmludCBwbG90cyAidG8gc2NyZWVuIiwgc2FuZHdpY2hlZCBiZXR3ZWVuIGBwZGYoKWAvYGpwZWcoKWAvYHBuZygpYC4uLiBhbmQgYGRldi5vZmYoKWAuIAotIFZlY3RvciB2cy4gcmFzdGVyOiBJbWFnZXMgYXJlIHN0b3JlZCBvbiB5b3VyIGNvbXB1dGVyIGFzIGVpdGhlciBfdmVjdG9yXyBvciBfcmFzdGVyXy4KICAgIC0gX19SYXN0ZXJfXzogYW4gYG5gIGJ5IGBtYCBncmlkIG9mIHBpeGVscywgZWFjaCB3aXRoIGl0cyBvd24gY29sb3VyLiBganBlZ2AsIGBwbmdgLCBgZ2lmYCwgYGJtcGAuCiAgICAtIF9fVmVjdG9yX186IHJlcHJlc2VudGVkIGFzIHNoYXBlcyBhbmQgbGluZXMuIGBwZGZgLCBbYHN2Z2BdKGh0dHBzOi8vd3d3Lnczc2Nob29scy5jb20vZ3JhcGhpY3Mvc3ZnX2ludHJvLmFzcCkuCiAgICAtIEZvciB0aXBzOiBbIjEwIHRpcHMgZm9yIG1ha2luZyB5b3VyIFIgZ3JhcGhpY3MgbG9vayB0aGVpciBiZXN0IiJdKGh0dHA6Ly9ibG9nLnJldm9sdXRpb25hbmFseXRpY3MuY29tLzIwMDkvMDEvMTAtdGlwcy1mb3ItbWFraW5nLXlvdXItci1ncmFwaGljcy1sb29rLXRoZWlyLWJlc3QuaHRtbCkuCiAgICAKIyBTY2FsZXM7IENvbG91cgoKU2NhbGUgZnVuY3Rpb25zIGluIGBnZ3Bsb3QyYCB0YWtlIHRoZSBmb3JtIGBzY2FsZV9bYWVzdGhldGljXV9bbWFwcGluZ10oKWAuCgpMZXQncyBmaXJzdCBmb2N1cyBvbiB0aGUgZm9sbG93aW5nIHBsb3Q6CgpgYGB7cn0KcF9zY2FsZXMgPC0gZ2dwbG90KGdhcG1pbmRlciwgYWVzKGdkcFBlcmNhcCwgbGlmZUV4cCkpICsKICAgICBnZW9tX3BvaW50KGFlcyhjb2xvdXI9cG9wKSwgYWxwaGE9MC4yKQpwX3NjYWxlcyArIAogICAgc2NhbGVfeF9sb2cxMCgpICsKICAgIHNjYWxlX2NvbG91cl9jb250aW51b3VzKHRyYW5zPSJsb2cxMCIpCmBgYAoKMS4gQ2hhbmdlIHRoZSB5LWF4aXMgdGljayBtYXJrIHNwYWNpbmcgdG8gMTA7IGNoYW5nZSB0aGUgY29sb3VyIHNwYWNpbmcgdG8gaW5jbHVkZSBhbGwgcG93ZXJzIG9mIDEwLgoKYGBge3J9CnBfc2NhbGVzICsKICAgIHNjYWxlX3hfbG9nMTAoKSArCiAgICBzY2FsZV9jb2xvdXJfY29udGludW91cygKICAgICAgICB0cmFucyAgPSAibG9nMTAiLCAKICAgICAgICBicmVha3MgPSAxMF4oMToxMCkKICAgICkgKwogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcz0xOjEwKjEwKQpgYGAKCjIuIFNwZWNpZnkgYHNjYWxlczo6Kl9mb3JtYXRgIGluIHRoZSBgbGFiZWxzYCBhcmd1bWVudCBvZiBhIHNjYWxlIGZ1bmN0aW9uIHRvIGRvIHRoZSBmb2xsb3dpbmc6CiAgICAtIENoYW5nZSB0aGUgeC1heGlzIGxhYmVscyB0byBkb2xsYXIgZm9ybWF0ICh1c2UgYHNjYWxlczo6ZG9sbGFyX2Zvcm1hdCgpYCkKICAgIC0gQ2hhbmdlIHRoZSBjb2xvdXIgbGFiZWxzIHRvIGNvbW1hIGZvcm1hdCAodXNlIGBzY2FsZXM6OmNvbW1hX2Zvcm1hdCgpYCkKCmBgYHtyfQpsaWJyYXJ5KHNjYWxlcykKcF9zY2FsZXMgKwogICAgc2NhbGVfeF9sb2cxMChsYWJlbHM9ZG9sbGFyX2Zvcm1hdCgpKSArCiAgICBzY2FsZV9jb2xvdXJfY29udGludW91cygKICAgICAgICB0cmFucyAgPSAibG9nMTAiLCAKICAgICAgICBicmVha3MgPSAxMF4oMToxMCksCiAgICAgICAgbGFiZWxzID0gY29tbWFfZm9ybWF0KCkKICAgICkgKwogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcz0xMCooMToxMCkpCmBgYAoKMy4gVXNlIGBSQ29sb3JCcmV3ZXJgIHRvIGNoYW5nZSB0aGUgY29sb3VyIHNjaGVtZS4KICAgIC0gTm90aWNlIHRoZSB0aHJlZSBkaWZmZXJlbnQgdHlwZXMgb2Ygc2NhbGVzOiBzZXF1ZW50aWFsLCBkaXZlcmdpbmcsIGFuZCBjb250aW51b3VzLgoKYGBge3J9CiMjIEFsbCBwYWxldHRlcyB0aGUgY29tZSB3aXRoIFJDb2xvckJyZXdlcjoKUkNvbG9yQnJld2VyOjpkaXNwbGF5LmJyZXdlci5hbGwoKQpwX3NjYWxlcyArCiAgICBzY2FsZV94X2xvZzEwKGxhYmVscz1kb2xsYXJfZm9ybWF0KCkpICsKICAgIHNjYWxlX2NvbG91cl9kaXN0aWxsZXIoCiAgICAgICAgdHJhbnMgICA9ICJsb2cxMCIsCiAgICAgICAgYnJlYWtzICA9IDEwXigxOjEwKSwKICAgICAgICBsYWJlbHMgID0gY29tbWFfZm9ybWF0KCksCiAgICAgICAgcGFsZXR0ZSA9ICJHcmVlbiIKICAgICkgKwogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcz0xMCooMToxMCkpCmBgYAoKNC4gVXNlIGB2aXJpZGlzYCB0byBjaGFuZ2UgdGhlIGNvbG91ciB0byBhIGNvbG91ci1ibGluZCBmcmllbmRseSBzY2hlbWUKICAgIC0gSGludDogYWRkIGBzY2FsZV9jb2xvdXJfdmlyaWRpc19jYCAoYGNgIHN0YW5kcyBmb3IgY29udGludW91czsgYGRgIGRpc2NyZXRlKS4KICAgIC0gWW91IGNhbiBjaG9vc2UgYSBwYWxldHRlIHdpdGggYG9wdGlvbmAuCgpgYGB7cn0KcF9zY2FsZXMgKwogICAgc2NhbGVfeF9sb2cxMChsYWJlbHM9ZG9sbGFyX2Zvcm1hdCgpKSArCiAgICBzY2FsZV9jb2xvdXJfdmlyaWRpc19jKAogICAgICAgIHRyYW5zICAgPSAibG9nMTAiLAogICAgICAgIGJyZWFrcyAgPSAxMF4oMToxMCksCiAgICAgICAgbGFiZWxzICA9IGNvbW1hX2Zvcm1hdCgpCiAgICApICsKICAgIHNjYWxlX3lfY29udGludW91cyhicmVha3M9MTAqKDE6MTApKQpgYGAKCiMgVGhlbWluZwoKQ2hhbmdpbmcgdGhlIGxvb2sgb2YgYSBncmFwaGljIGNhbiBiZSBhY2hpZXZlZCB0aHJvdWdoIHRoZSBgdGhlbWUoKWAgbGF5ZXIuCgpUaGVyZSBhcmUgWyJjb21wbGV0ZSB0aGVtZXMiXShodHRwOi8vZ2dwbG90Mi50aWR5dmVyc2Uub3JnL3JlZmVyZW5jZS9nZ3RoZW1lLmh0bWwpIHRoYXQgY29tZSB3aXRoIGBnZ3Bsb3QyYCwgbXkgZmF2b3VyaXRlIGJlaW5nIGB0aGVtZV9id2AgKEkndmUgZ3Jvd24gdGlyZWQgb2YgdGhlIGRlZmF1bHQgZ3JheSBiYWNrZ3JvdW5kLCBzbyBgdGhlbWVfYndgIGlzIHJlZnJlc2hpbmcpLgoKMS4gQ2hhbmdlIHRoZSB0aGVtZSBvZiB0aGUgZm9sbG93aW5nIHBsb3QgdG8gYHRoZW1lX2J3KClgOgoKYGBge3J9CmdncGxvdChpcmlzLCBhZXMoU2VwYWwuV2lkdGgsIFNlcGFsLkxlbmd0aCkpICsKICAgICBmYWNldF93cmFwKH4gU3BlY2llcykgKwogICAgIGdlb21fcG9pbnQoKSArCiAgICAgbGFicyh4ID0gIlNlcGFsIFdpZHRoIiwKICAgICAgICAgIHkgPSAiU2VwYWwgTGVuZ3RoIiwKICAgICAgICAgIHRpdGxlID0gIlNlcGFsIHNpemVzIG9mIHRocmVlIHBsYW50IHNwZWNpZXMiKSArCiAgdGhlbWVfYncoKQpgYGAKCjIuIFRoZW4sIGNoYW5nZSBmb250IHNpemUgb2YgYXhpcyBsYWJlbHMsIGFuZCB0aGUgc3RyaXAgYmFja2dyb3VuZCBjb2xvdXIuIE90aGVycz8KCmBgYHtyfQpnZ3Bsb3QoaXJpcywgYWVzKFNlcGFsLldpZHRoLCBTZXBhbC5MZW5ndGgpKSArCiAgICAgZmFjZXRfd3JhcCh+IFNwZWNpZXMpICsKICAgICBnZW9tX3BvaW50KCkgKwogICAgIGxhYnMoeCA9ICJTZXBhbCBXaWR0aCIsCiAgICAgICAgICB5ID0gIlNlcGFsIExlbmd0aCIsCiAgICAgICAgICB0aXRsZSA9ICJTZXBhbCBzaXplcyBvZiB0aHJlZSBwbGFudCBzcGVjaWVzIikgKwogICAgdGhlbWVfYncoKSArCiAgICB0aGVtZShheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xNiksCiAgICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAib3JhbmdlIiksCiAgICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiYmx1ZSIpKQpgYGAKCgojIFBsb3RseQoKQ29uc2lkZXIgdGhlIGZvbGxvd2luZyBwbG90OgoKYGBge3J9CihwIDwtIGdhcG1pbmRlciAlPiUgCiAgICAgZmlsdGVyKGNvbnRpbmVudCAhPSAiT2NlYW5pYSIpICU+JSAKICAgICBnZ3Bsb3QoYWVzKGdkcFBlcmNhcCwgbGlmZUV4cCkpICsKICAgICBnZW9tX3BvaW50KGFlcyhjb2xvdXI9cG9wKSwgYWxwaGE9MC4yKSArCiAgICAgc2NhbGVfeF9sb2cxMChsYWJlbHM9ZG9sbGFyX2Zvcm1hdCgpKSArCiAgICAgc2NhbGVfY29sb3VyX2Rpc3RpbGxlcigKICAgICAgICAgdHJhbnMgICA9ICJsb2cxMCIsCiAgICAgICAgIGJyZWFrcyAgPSAxMF4oMToxMCksCiAgICAgICAgIGxhYmVscyAgPSBjb21tYV9mb3JtYXQoKSwKICAgICAgICAgcGFsZXR0ZSA9ICJHcmVlbnMiCiAgICAgKSArCiAgICAgZmFjZXRfd3JhcCh+IGNvbnRpbmVudCkgKwogICAgIHNjYWxlX3lfY29udGludW91cyhicmVha3M9MTAqKDE6MTApKSArCiAgICAgdGhlbWVfYncoKSkKYGBgCgoxLiBDb252ZXJ0IGl0IHRvIGEgYHBsb3RseWAgb2JqZWN0IGJ5IGFwcGx5aW5nIHRoZSBgZ2dwbG90bHkoKWAgZnVuY3Rpb246CgpgYGB7cn0KbGlicmFyeShnZ3Bsb3RseSkKZ2dwbG90bHkocCkKYGBgCgoyLiBZb3UgY2FuIHNhdmUgYSBwbG90bHkgZ3JhcGggbG9jYWxseSBhcyBhbiBodG1sIGZpbGUuIFRyeSBzYXZpbmcgdGhlIGFib3ZlOgogICAgLSBOT1RFOiBwbG90bHkgZ3JhcGhzIGRvbid0IHNlZW0gdG8gc2hvdyB1cCBpbiBSbWQgX25vdGVib29rc18sIGJ1dCB0aGV5IGRvIHdpdGggUm1kIF9kb2N1bWVudHNfLgoKYGBge3J9CnAgJT4lIAogICAgZ2dwbG90bHkoKSAlPiUgCiAgICBodG1sd2lkZ2V0czo6c2F2ZVdpZGdldCgiTE9DQVRJT05fR09FU19IRVJFIikKYGBgCgoKMy4gUnVuIHRoaXMgY29kZSB0byBzZWUgdGhlIGpzb24gZm9ybWF0IHVuZGVybmVhdGg6CgpgYGB7cn0KcCAlPiUgCiAgICBnZ3Bsb3RseSgpICU+JSAKICAgIHBsb3RseV9qc29uKCkKYGBgCgoKNC4gQ2hlY2sgb3V0IGNvZGUgdG8gbWFrZSBhIHBsb3RseSBvYmplY3QgZnJvbSBzY3JhdGNoIHVzaW5nIGBwbG90X2x5KClgIC0tIHNjYXR0ZXJwbG90IG9mIGdkcFBlcmNhcCB2cyBsaWZlRXhwLgogICAgLSBDaGVjayBvdXQgdGhlIFtjaGVhdCBzaGVldF0oaHR0cHM6Ly9pbWFnZXMucGxvdC5seS9wbG90bHktZG9jdW1lbnRhdGlvbi9pbWFnZXMvcl9jaGVhdF9zaGVldC5wZGYpLgoKYGBge3J9CnBsb3RfbHkoZ2FwbWluZGVyLCAKICAgICAgICB4ID0gfmdkcFBlcmNhcCwgCiAgICAgICAgeSA9IH5saWZlRXhwLCAKICAgICAgICB0eXBlID0gInNjYXR0ZXIiLAogICAgICAgIG1vZGUgPSAibWFya2VycyIsCiAgICAgICAgb3BhY2l0eSA9IDAuMikgJT4lIAogICAgbGF5b3V0KHhheGlzID0gbGlzdCh0eXBlID0gImxvZyIpKQpgYGAKCjUuIEFkZCBwb3B1bGF0aW9uIHRvIGZvcm0gYSB6LWF4aXMgZm9yIGEgM0QgcGxvdDoKCmBgYHtyfQpwbG90X2x5KGdhcG1pbmRlciwgCiAgICAgICAgeCA9IH5nZHBQZXJjYXAsIAogICAgICAgIHkgPSB+bGlmZUV4cCwgCiAgICAgICAgeiA9IEZJTExfVEhJU19JTiwKICAgICAgICB0eXBlID0gInNjYXR0ZXIzZCIsCiAgICAgICAgbW9kZSA9ICJtYXJrZXJzIiwKICAgICAgICBvcGFjaXR5ID0gMC4yKQpgYGAKCgo=